<?php

/**
 * SmartPHP framework
 *
 * @name SmartPHP framework
 * @package SmartPHP
 * @author 费尔 <admin@smartphp.cn>
 * @version 1.0 Beta
 * @link http://www.smartphp.cn
 * @copyright smartphp.cn
 * @license <a href="http://www.smartphp.cn">smartphp</a>
 */

namespace Base;

/**
 * 配制类
 *
 * @author 费尔 <admin@xuai.cn>
 */
class Config {

    // 配置参数
    private static $config = [];

    /**
     * 获取配置参数 为空则获取所有配置
     * @access public
     * @param string    $name 配置参数名（支持二级配置 .号分割）
     * @return mixed
     */
    public static function get($name = null) {
        self::parseName($name, $key, $type);
        return $name === null ? (self::$config[$type] ?? null) : (self::$config[$type][$key] ?? null);
    }

    /**
     * 返回所有配制
     * @access public
     * @return array
     */
    public static function getAll() {
        return self::$config;
    }

    /**
     * 设置配置参数 name为数组则为批量设置
     * @access public
     * @param string|array  $name 配置参数名（支持二级配置 .号分割）
     * @param mixed         $value 配置值
     * @return mixed
     */
    public static function set($name, $value = null) {
        if (is_string($name)) {
            self::parseName($name, $key, $type);
            self::$config[$type][$key] = $value;
        } elseif (is_array($name)) {
            $config = array_change_key_case($name, CASE_LOWER);
            foreach ($config as $key => $vo) {
                self::$config[$key] = isset(self::$config[$key]) ? array_merge(self::$config[$key], $vo) : $vo;
            }
        }
        return self::$config;
    }

    /**
     * 检测配置是否存在
     * @access public
     * @param string    $name 配置参数名（支持二级配置 .号分割）
     * @return bool
     */
    public static function has($name) {
        self::parseName($name, $key, $type);
        return isset(self::$config[$type][$key]);
    }

    /**
     * 解析配制名称
     * @access public
     * @param string $name
     * @param string $key
     * @param string $type
     */
    public static function parseName($name, &$key, &$type) {
        $key = explode('.', $name);
        $type = strtolower(isset($key[1]) ? $key[0] : 'default');
        $key = strtolower($key[1] ?? $key[0]);
    }

    /**
     * 解析配置文件或内容
     * @access public
     * @param string    $config 配置文件路径或内容
     * @param string    $type 配置解析类型
     * @param string    $name 配置名（如设置即表示二级配置）
     * @param string    $range  作用域
     */
    public static function parse($config, $type = '') {
        static $driver = [];
        if (empty($type))
            $type = pathinfo($config, PATHINFO_EXTENSION);
        $class = false !== strpos($type, '\\') ? $type : '\\Driver\\Config\\' . ucwords($type);
        $class = $driver[$class] ?? ($driver[$class] = (new $class()));
        self::set($class->parse($config));
    }

}
